
package com.e885.util.date;

import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import com.e885.constant.util.DirectionConstant;
import com.e885.util.string.StringUtil;

/**
 * @author Grady.Kao
 * @version 1.0
 * @company E885 Group
 * @copyright Copyright (c) 2000-2008
 */

public class E885DateFormat extends SimpleDateFormat
{
	private static final long serialVersionUID = -3776149393815511144L;

	private String pattern;

	private Calendar calendar = Calendar.getInstance();

	/**
	 * @param pattern
	 */
	public E885DateFormat( String pattern )
	{
		this.pattern = pattern;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.text.SimpleDateFormat#applyPattern(java.lang.String)
	 */
	@Override
	public void applyPattern( String pattern )
	{
		this.pattern = pattern;
	}

	/**
	 * 格式化日期, 如果是使用 ROC 規格, 請用小寫 't', 或大寫 'T'<br>
	 * 小寫 t, 沒有三位數字的年份, 不會補 0<br>
	 * 大寫 T, 會補 0<br>
	 * 
	 * @param date
	 * @return
	 */
	public String formatDate( Date date )
	{
		if( date == null )
			throw new IllegalArgumentException( "date is null" );

		if( isIncludeROCPattern() )
			return formatForROCPattern( date );
		else
		{
			super.applyPattern( pattern );
			return format( date );
		}
	}

	/**
	 * 格式化民國年的 pattern
	 * 
	 * @return
	 */
	private String formatForROCPattern( Date date )
	{
		StringBuffer buffer = new StringBuffer();

		calendar.setTime( date );

		SimpleDateFormat dateFormat = new SimpleDateFormat();
		DecimalFormat decimalFormat = new DecimalFormat();

		// 先分解小寫 "t"
		String[] patternsForLowercase = StringUtil.separate( pattern, 't', true );

		int patternsForLowercaseLength = patternsForLowercase.length;

		for( int i = 0; i < patternsForLowercaseLength; i++ )
		{
			// 再分解大寫 "t"
			String[] patternsForUppercase = StringUtil.separate( patternsForLowercase[ i ], 'T', true );

			int patternsForUppercaseLength = patternsForUppercase.length;

			for( int j = 0; j < patternsForUppercaseLength; j++ )
			{
				String temp = patternsForUppercase[ j ];

				// 有含中華民國年的 pattern
				if( StringUtil.indexOfExcludeQuote( temp, "T", '\'' ) != -1 || StringUtil.indexOfExcludeQuote( temp, "t", '\'' ) != -1 )
				{
					int year = calendar.get( Calendar.YEAR ) - 1911;

					// 民國沒有0年, 所以 1911: -1 年, 1910: -2 年, 以此類推
					if( year <= 0 )
					{
						year -= 1;

						// 檢查前二個字元是否含有"民國"字串, 如果有, 當年份小於0時, 改為 "前XX"
						if( buffer.length() >= 2 && buffer.substring( buffer.length() - 2, buffer.length() ).equals( "民國" ) )
						{
							year = 0 - year;
							buffer.append( "前" );
						}
					}

					char decimalFormatChar;

					// 處理大寫
					if( temp.indexOf( "T" ) != -1 )
						decimalFormatChar = '0';
					else
						decimalFormatChar = '#';

					decimalFormat.applyPattern( StringUtil.pendingString( String.valueOf( decimalFormatChar ), temp.length(),
																		  decimalFormatChar, DirectionConstant.FRONT ) );

					buffer.append( decimalFormat.format( year ) );

				}
				else
				{
					dateFormat.applyPattern( temp );
					buffer.append( dateFormat.format( date ) );
				}
			}
		}

		return buffer.toString();
	}

	/**
	 * 檢查是否為中華民國年的 pattern<br>
	 * patter 中有小寫 t, 或大寫的 T, 但不包含單引號內的字串, 即為中華民國年的 pattern
	 * 
	 * @return
	 */
	public boolean isIncludeROCPattern()
	{
		// 先去除單引號位置
		String temp = StringUtil.removeQuoteString( pattern, '\'' );

		if( temp.indexOf( "t" ) != -1 || temp.indexOf( "T" ) != -1 )
			return true;
		else
			return false;
	}
}
